﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplicationGDI7._1
{
    public partial class Form1 : Form
    {
        GraphicsPath path;

        List<double> mlArray = new List<double>();

        DateTime dotCreationTime;
        int color1 = 0, color2 = 0, color3 = 0;
        int fallOut = 0;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            using (Graphics gr = e.Graphics)
            {
                Pen p = new Pen(Color.Red);

                Random r = new Random();

                color1 = r.Next(0, 255);
                color2 = r.Next(0, 255);
                color3 = r.Next(0, 255);

                SolidBrush b = new SolidBrush(Color.FromArgb(color1,color2,color3));
                int coorX = r.Next(900);
                int coorY = r.Next(360);
                int circleSize = r.Next(10, 50);

                path = new GraphicsPath();  // создали новый этам траектории
                path.StartFigure(); // старт точки (10, 10)
                
                // добавим замкнутую фигуру
                path.AddEllipse(coorX, coorY, circleSize, circleSize);

                gr.FillPath(b, path);
                gr.DrawPath(p, path);
                dotCreationTime = DateTime.Now;
            }
        }

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            if (path.IsVisible(e.X, e.Y))
            {
                double result = (int)DateTime.Now.Subtract(dotCreationTime).TotalMilliseconds;
                mlArray.Add(result);

                label1.Text = "Score: " + mlArray.Count;
                label2.Text = "Fall: " + fallOut;
                
                Invalidate();   // инициализирует вызов метода формы
            }
            else
            {
                fallOut += 1;
                label1.Text = ("Score: " + mlArray.Count);
                label2.Text = ("Fall: " + fallOut);

                if (fallOut == 3)
                {
                    mlArray.Sort();

                    int summ = 0;

                    foreach(var item in mlArray)
                    {
                        summ += (int)item;
                    }

                    double avarageTime = 0;
                    double worstTime = 0;
                    double bestTime = 0;

                    if (mlArray.Count > 0)
                    {
                        avarageTime = (double)(summ / mlArray.Count) / 1000;
                        avarageTime = Math.Truncate(avarageTime * 100) / 100;

                        worstTime = (mlArray[mlArray.Count - 1]) / 1000;
                        worstTime = Math.Truncate(worstTime * 100) / 100;

                        bestTime = mlArray[0] / 1000;
                        bestTime = Math.Truncate(bestTime * 100) / 100;
                    }

                    DialogResult result = MessageBox.Show("\t\tGAME END!!!\n\n" + "\t\t     Time\n\n" +
                        "Best\t|\tWorst\t|\tAvarage\n" + bestTime + "\t|\t" + worstTime + "\t|\t" + avarageTime + "\n\n\t\t\tWant try again?", 
                        "GAME END", MessageBoxButtons.YesNo);
                    if (result == DialogResult.Yes)
                    {
                        mlArray.Clear();
                        fallOut = 0;

                        label1.Text = ("Score: " + mlArray.Count);
                        label2.Text = "Fall:" + fallOut;
                        Invalidate();
                    }

                    if (result == DialogResult.No)
                    {
                        Close();
                    }
                }
            }
        }
    }
}

/*
 * Фигура с произвольными границами.
 * Это реализуется с помощью траекторий
 * Graphics Path (предстовляет собой коллекцию или массив) хранит различные графические примитивы.
 * создаем Path ложим в нее любые фигуры мы можем соеденить их в любых точках 
 * и можем получить любую линию (типо)
 * 
 * Задание - появляется элипс. и ты на него должен успеть попасть.
*/